iT邦幫忙

0

我寫了一個 CLI 工具,因為教 PM 什麼是 /etc/hosts 比自己做還累

  • 分享至 

  • xImage
  •  

事情的起因

上個月 PM 跑來問我:「欸,那個 staging 環境的網址打不開,你可以幫我看一下嗎?」

結果就是需要改一下 hosts 檔,把 api.staging.local 指到新的 IP。很簡單對吧?

但接下來我花了 15 分鐘解釋:

  • hosts 檔是什麼
  • 為什麼在 /etc/ 底下
  • 為什麼要打 sudo
  • 為什麼不能刪掉 localhost 那行
  • vim 怎麼存檔退出(對,又是這個)

最後我還是自己幫他改了。

這種事發生不只一次。每次有新的 SA、FAE 需要改 hosts,就要重新解釋一輪。後來我想,與其每次解釋,不如做一個工具,讓他們複製貼上就好。

於是就有了 hostfile

demo

現有工具的問題

直接編輯 /etc/hosts:對工程師來說沒什麼,但對不熟 terminal 的人來說風險很高。少刪一行、多一個空白,DNS 就爛了。

GUI 工具(像 SwitchHosts):功能很完整,但你沒辦法把一個 GUI 操作流程貼到 Slack 上叫人照做。

其他 CLI 工具:各有不同的設計取捨,但在「讓非技術人員安全執行單一指令」這個場景下,大多不是設計重點。

hostfile 做了什麼不一樣的事

Managed block 隔離

hostfile 只動自己的區塊,你手寫的內容完全不會被碰到:

# 你的東西 — hostfile 不會動
127.0.0.1  localhost

#### hostfile >>>>>
192.168.1.100  web.local api.local
#### hostfile <<<<<

就算 hostfile 出了什麼問題,最多就是 managed block 裡面的東西壞掉,你原本的設定不受影響。

Enable / Disable 不用刪除

臨時要關掉某個 domain?hostfile disable api.local。要開回來?hostfile enable api.local。不用重新輸入 IP,不用記得之前的設定。

JSON I/O + Pipeline

這個是我後來加的,但用起來超方便:

# 匯出成 JSON
hostfile show --json
# {"192.168.1.100": ["web.local", "api.local"]}

# 從 JSON 匯入
echo '{"10.0.0.1":["db.local"]}' | hostfile merge -

# 跨機器同步
hostfile show --json | ssh another-machine hostfile apply -

applymerge 都會先驗證格式,壞掉的 JSON、不合法的 IP 會直接被擋下來,不會動到 hosts 檔。

自動提權

hostfile 會自己嘗試 sudo(Linux/macOS)或 gsudo(Windows),使用者不需要記得要打 sudo

實際使用場景

# 叫 PM 跑這一行就好
hostfile add 192.168.1.100 web.local api.local

# 切換環境前先存檔
hostfile save before-migration

# 出事了,一秒還原
hostfile load before-migration

# 看目前設定
hostfile show

# 全部清掉重來
hostfile clean

最常見的用法就是:工程師在 Slack 上貼一行 hostfile add ...,對方複製貼上按 Enter,搞定。

安裝

# macOS / Linux
brew install vulcanshen/tap/hostfile

# 或一行安裝
curl -fsSL https://raw.githubusercontent.com/vulcanshen/hostfile/main/install.sh | sh

# Windows
irm https://raw.githubusercontent.com/vulcanshen/hostfile/main/install.ps1 | iex

也有 .deb.rpm、Scoop 可以用,詳細看 README

最後

這不是什麼改變世界的工具,就是解決一個很小但很煩的問題。如果你也常常需要幫別人改 hosts 檔,試試看吧。

GitHub: vulcanshen/hostfile


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言